package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"grpc-stream/proto"
	"sync"
	"time"
)

func main() {
	conn, err := grpc.Dial("127.0.0.1:50052", grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	client := proto.NewGreeterClient(conn)

	// ******服务端流模式示例***start******
	//res,err:=client.GetStream(context.Background(),&proto.StreamRequestData{Data: "开始要时间"})
	//if err!=nil{
	//	panic(err)
	//}
	//for  { // 开启死循环，不停接收数据
	//	r,err:=res.Recv() // 本质就是socket接收数据
	//	if err != nil {
	//		fmt.Println("接收出错")
	//		break
	//	}
	//	fmt.Println(r.Data)
	//}
	// ******服务端流模式示例***end******

	// ******客户端端流模式示例***start******
	//res, err := client.PutStream(context.Background())
	//if err != nil {
	//	fmt.Println(err)
	//	panic(err)
	//}
	//var i = 0
	//for {
	//	res.Send(&proto.StreamRequestData{
	//		Data: fmt.Sprintf("客户端当前时间为：%v", time.Now().Unix()),
	//	})
	//	time.Sleep(time.Second)
	//	i++
	//	if i == 10 {
	//		break
	//	}
	//}
	// ******客户端流模式示例***end******

	// ******双向流模式示例***start******
	req, err := client.AllStream(context.Background())
	wg := sync.WaitGroup{}
	wg.Add(2)

	// 开协程发送数据，发送10次
	go func() {
		for i := 0; i < 10; i++ {
			_ = req.Send(&proto.StreamRequestData{
				Data: "客户端发送的数据",
			})
			time.Sleep(time.Second)
		}
		wg.Done()
	}()

	// 开协程接收数据，接收10次
	go func() {
		for i := 0; i < 10; i++ {
			r, err := req.Recv()
			if err != nil {
				fmt.Println("出错了")
				return
			}
			fmt.Println(r.Data)
		}
		wg.Done()
	}()

	wg.Wait()
	// ******双向流模式示例***end******
}
